package com.xkcoding.rpc.client;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.List;

public class CalculatorRemoteImpl implements Calculator {

    /**
     * 这里的 add 方法，并不是实现了甲方操作，而是通过lookupProviders（）方法获取服务端的实现集合，
     * lookupProviders，其实就是在寻找要调用的服务的实例列表。在分布式应用下，通常会有一个服务注册中心，来提供查询实例列表的功能。
     *
     * chooseTarget ：负载均衡，本质上是找到服务端最优的服务
     *
     *
     * Socket就是实现客户端和服务端进行连接，比如Java的Socket，
     * 当然，你也可以用基于Http协议的HttpClient，或者其他通讯工具类，都可以，RPC并没有规定说你要用何种协议进行通讯；
     *
     * generateRequest（a,b）：是将参数进行序列化，数据网络传输，所以需要序列化，在服务端再将数据反序列化，执行完结果，再序列化返回到客户端。
     */
    public int add(int a, int b) {
//        List<String> addressList = lookupProviders("Calculator.add");
//        String address = chooseTarget(addressList);
//        try {
//            Socket socket = new Socket(address, PORT);
//
//            // 将请求序列化
//            CalculateRpcRequest calculateRpcRequest = generateRequest(a, b);
//            ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
//
//            // 将请求发给服务提供方
//            objectOutputStream.writeObject(calculateRpcRequest);
//
//            // 将响应体反序列化
//            ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
//            Object response = objectInputStream.readObject();
//
//            if (response instanceof Integer) {
//                return (Integer) response;
//            } else {
//                throw new InternalError();
//            }
//
//        } catch (Exception e) {
//            System.err.print(e.getMessage());
//            throw new InternalError();
//        }
//    }
        return 0;
    }
}
